//////////////////////////////////////////////////////////////////////////////////
// Engineer: Anmai
// Create Date: 2017/06/03 13:30:36
// Module Name: x7seg
// Target Devices: Basys3
// Tool Versions: Vivado 2016.3
// Description: 带消隐的7段数码管显示4个16进制数字
// Revision: Final
//////////////////////////////////////////////////////////////////////////////////

module x7seg (
	input wire clk,					// 时钟周期
	input wire rst_n,				// 异步复位低有效
	input wire [15:0] x,			// 待显示的16进制数字
	output reg [6:0] a_to_g,		// 7段数码管显示
	output reg [3:0] an,			// 数码管选位
	output wire dp					// 小数点
);
	wire [1:0] s;					// 选位
	wire [3:0] aen;					// 前导消隐
	reg [3:0] digit;				// 当前处理的数字
	reg [19:0] clkdiv;				// 时钟分频，每5.2ms改变一次s的值

	assign dp = 1;
	assign s = clkdiv[19:18];
	assign aen[3] = x[15] | x[14] | x[13] | x[12];
	assign aen[2] = x[15] | x[14] | x[13] | x[12] | x[11] | x[10] | x[9] | x[8];
	assign aen[1] = x[15] | x[14] | x[13] | x[12] | x[11] | x[10] | x[9] | x[8] | x[7] | x[6] | x[5] | x[4];
	assign aen[0] = 1;

	// 4位数字4选1
	always @(*) begin
		case (s)
			0 : digit = x[3:0];
			1 : digit = x[7:4];
			2 : digit = x[11:8];
			3 : digit = x[15:12];
			default : digit = x[3:0];
		endcase
	end

	// 将数字转化为数码管显示
	always @(*) begin
		case (digit)
			0 : a_to_g = 7'b0000001;
			1 : a_to_g = 7'b1001111;
			2 : a_to_g = 7'b0010010;
			3 : a_to_g = 7'b0000110;
			4 : a_to_g = 7'b1001100;
			5 : a_to_g = 7'b0100100;
			6 : a_to_g = 7'b0100000;
			7 : a_to_g = 7'b0001111;
			8 : a_to_g = 7'b0000000;
			9 : a_to_g = 7'b0000100;
			'hA : a_to_g = 7'b0001000;
			'hB : a_to_g = 7'b1100000;
			'hC : a_to_g = 7'b0110001;
			'hD : a_to_g = 7'b1000010;
			'hE : a_to_g = 7'b0110000;
			'hF : a_to_g = 7'b0111000;
			default : a_to_g = 7'b0000001;
		endcase
	end

	// 输出选择
	always @(*) begin
		an = 4'b1111;
		if (aen[s] == 1) an[s] = 0;
	end

	// 时钟分频
	always @(posedge clk or negedge rst_n) begin
		if (~rst_n) begin
			clkdiv <= 0;
		end else begin
			clkdiv <= clkdiv + 1;
		end
	end

endmodule